package com.example.examsystem.controller;

import com.example.examsystem.dto.PageResponse;
import com.example.examsystem.dto.SubjectDto;
import com.example.examsystem.service.SubjectService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.List;

/**
 * 学科控制器
 * 处理学科的CRUD操作
 */
@RestController
@RequestMapping("/subjects")
@RequiredArgsConstructor
@Slf4j
public class SubjectController {
    
    private final SubjectService subjectService;
    
    /**
     * 获取学科列表
     * @param page 页码
     * @param size 每页大小
     * @param name 学科名称
     * @param code 学科代码
     * @param status 状态
     * @return 分页学科列表
     */
    @GetMapping
    @PreAuthorize("hasAuthority('subject:list:view')")
    public ResponseEntity<PageResponse<SubjectDto>> getSubjects(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String code,
            @RequestParam(required = false) String status) {
        log.info("查询学科列表 - 页码: {}, 大小: {}, 名称: {}, 代码: {}, 状态: {}", 
                page, size, name, code, status);
        PageResponse<SubjectDto> subjects = subjectService.getSubjects(page, size, name, code, status);
        return ResponseEntity.ok(subjects);
    }
    
    /**
     * 获取学科详情
     * @param id 学科ID
     * @return 学科详情
     */
    @GetMapping("/{id}")
    @PreAuthorize("hasAuthority('subject:list:view')")
    public ResponseEntity<SubjectDto> getSubject(@PathVariable Long id) {
        log.info("获取学科详情 - ID: {}", id);
        SubjectDto subject = subjectService.getSubject(id);
        return ResponseEntity.ok(subject);
    }
    
    /**
     * 创建学科
     * @param subjectDto 学科数据
     * @return 创建的学科
     */
    @PostMapping
    @PreAuthorize("hasAuthority('subject:list:create')")
    public ResponseEntity<SubjectDto> createSubject(@Valid @RequestBody SubjectDto subjectDto) {
        log.info("创建学科 - 名称: {}, 代码: {}", subjectDto.getName(), subjectDto.getCode());
        SubjectDto createdSubject = subjectService.createSubject(subjectDto);
        return ResponseEntity.ok(createdSubject);
    }
    
    /**
     * 更新学科
     * @param id 学科ID
     * @param subjectDto 学科数据
     * @return 更新的学科
     */
    @PutMapping("/{id}")
    @PreAuthorize("hasAuthority('subject:list:edit')")
    public ResponseEntity<SubjectDto> updateSubject(@PathVariable Long id, 
                                                   @Valid @RequestBody SubjectDto subjectDto) {
        log.info("更新学科 - ID: {}, 名称: {}", id, subjectDto.getName());
        SubjectDto updatedSubject = subjectService.updateSubject(id, subjectDto);
        return ResponseEntity.ok(updatedSubject);
    }
    
    /**
     * 删除学科
     * @param id 学科ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @PreAuthorize("hasAuthority('subject:list:delete')")
    public ResponseEntity<Void> deleteSubject(@PathVariable Long id) {
        log.info("删除学科 - ID: {}", id);
        subjectService.deleteSubject(id);
        return ResponseEntity.ok().build();
    }
    
    /**
     * 获取所有激活的学科
     * @return 激活的学科列表
     */
    @GetMapping("/active")
    public ResponseEntity<List<SubjectDto>> getActiveSubjects() {
        log.info("获取所有激活的学科");
        List<SubjectDto> subjects = subjectService.getActiveSubjects();
        return ResponseEntity.ok(subjects);
    }
}